package com.bird.file.bytestream;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author sijunqiang
 * @data 2021/7/31 16:05
 * @description: 文件输入流。从文件中读取字节.
 */
public class FileInputStream {

//1. FileInputStream(File file)： 通过打开与实际文件的连接来创建一个 FileInputStream ，该文件由文件系统中的 File对象 file命名。
//2. FileInputStream(String name)： 通过打开与实际文件的连接来创建一个 FileInputStream ，该文件由文件系统中的路径名 name命名。
//当你创建一个流对象时，必须传入一个文件路径。该路径下，如果没有该文件,会抛出FileNotFoundException 。


    // 创建文件字节输入流对象
    public static void main1(String[] args) throws FileNotFoundException {
        // 使用file对象创建输入流对象
        File file = new File("fow.txt");
        java.io.FileInputStream fos = new java.io.FileInputStream(file);

        // 使用文件名创建输入流对象
        java.io.FileInputStream fos1 = new java.io.FileInputStream("fow.txt");
    }

    // 读取单个字节 read()每次只能读取一次 读取到最后返回-1;
    public static void main2(String[] args) throws IOException {

        // 将文件数据读取到文件输入流中
        File file = new File("b.txt");
        java.io.FileInputStream fos = new java.io.FileInputStream(file);

        // 从文件输入流中读取数据 一次只能读取一个字节
        int read = fos.read();
        System.out.println((char) read);

        read = fos.read();
        System.out.println((char) read);

        read = fos.read();
        System.out.println((char) read);

        read = fos.read();
        System.out.println((char) read);

        // 如果读取到最后一行就返回 -1
        if (read == -1) {
            fos.close();
        }
    }

    // 从字节输入流中 读取字节数据 循环的读
    public static void main3(String[] args) throws IOException {

        File file = new File("b.txt");
        java.io.FileInputStream fos = new java.io.FileInputStream(file);
        // 如果 fos.read() 不等于-1 就说明还没有读取完 管道中还存在字节数据
        int b;
        while ((b = fos.read()) != -1) {
            System.out.println((char) fos.read());
        }
        fos.close();
    }

    // 使用字节数组读取: 字节数据 read(byte[] b); 每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时 返回-1
    public static void mai4(String[] args) throws IOException {

        // 使用文件名创建输入流对象 将文本数据读取到输入流中
        java.io.FileInputStream fos = new java.io.FileInputStream("b.txt");

        int len;
        // 定义字节数组，作为装字节数据的容器 {每次读取2个字节长度的字节 }
        byte[] b = new byte[2];
        while ((len = fos.read(b)) != -1) {
            //将每次读取后,把数组变成字符串打印     len 每次读取的有效字节个数
            // 如果不指定有效的长度会导致 字节数据重复
            System.out.println(new String(b, 0, len));
        }
        fos.close();
    }


    // 复制图片
    public static void main(String[] args) throws IOException {


        //先从目的地读取到图片资源 打开输入流
        String origin = "D:\\20181102122054212.png";
        java.io.FileInputStream fis = new java.io.FileInputStream(origin);


        //然后再将图片资源写出到另外一个地方  打开输出流
        String target = "20181102122054212.png";
        java.io.FileOutputStream fos = new java.io.FileOutputStream(target);

        // 开始从输入流中读取资源数据

        // 定义每次读取的字节大小  每次从输入流中读取1024个字节的长度的字节数据
        byte[] b = new byte[1024];

        // 每次从输入流中实际读取的字节长度 ,如果等于1 说明读取完了
        int len;
        while ((len = fis.read(b)) != -1) {
            // 将读取到的字节数组写出去
            fos.write(b, 0, len);
        }
        // 3.关闭资源
        fos.close();
        fis.close();
    }

    //流的关闭原则：先开后关，后开先关。
}
